]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
appDisplay: Properly destroy SwipeTracker on destroy
authorGeorges Basile Stavracas Neto <georges.stavracas@gmail.com>
Thu, 26 Nov 2020 18:10:11 +0000 (15:10 -0300)
committerMarge Bot <marge-bot@gnome.org>
Wed, 2 Dec 2020 22:43:04 +0000 (22:43 +0000)
SwipeTracker connects to signals of the stage, but doesn't disconnect on
destroy, leaving them hanging and potentially running callbacks for
destroyed objects.

This is visible when removing a folder by dragging all icons out, and
running the swipe gestures, which will produce a bunch of warnings.

Explicitly destroy, remove, and disconnect the swipe tracker.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1518>

js/ui/appDisplay.js
js/ui/swipeTracker.js

index ac92d2fd9da4ecd96e649404ac350f972ec831bf..c5fa78ee6125b0a36644d1b240347a6c9fea7229 100644 (file)
@@ -217,6 +217,12 @@ var BaseAppView = GObject.registerClass({
             this._parentalControlsManager.disconnect(this._appFilterChangedId);
             this._appFilterChangedId = 0;
         }
+
+        if (this._swipeTracker) {
+            this._swipeTracker.destroy();
+            delete this._swipeTracker;
+        }
+
         this._removeDelayedMove();
         this._disconnectDnD();
     }
index a638d78019ca6e025a6c70e659cc00bc17ea1527..fd13fd72527432de46facdb566614e02e1d4a92f 100644 (file)
@@ -54,7 +54,8 @@ const TouchpadSwipeGesture = GObject.registerClass({
         this._orientation = Clutter.Orientation.VERTICAL;
         this._enabled = true;
 
-        global.stage.connect('captured-event::touchpad', this._handleEvent.bind(this));
+        this._stageCaptureEvent =
+            global.stage.connect('captured-event::touchpad', this._handleEvent.bind(this));
     }
 
     get enabled() {
@@ -125,6 +126,13 @@ const TouchpadSwipeGesture = GObject.registerClass({
 
         return Clutter.EVENT_STOP;
     }
+
+    destroy() {
+        if (this._stageCaptureEvent) {
+            global.stage.disconnect(this._stageCaptureEvent);
+            delete this._stageCaptureEvent;
+        }
+    }
 });
 
 const TouchSwipeGesture = GObject.registerClass({
@@ -643,4 +651,16 @@ var SwipeTracker = GObject.registerClass({
         this._velocity = 0;
         this._state = State.SCROLLING;
     }
+
+    destroy() {
+        if (this._touchpadGesture) {
+            this._touchpadGesture.destroy();
+            delete this._touchpadGesture;
+        }
+
+        if (this._touchGesture) {
+            global.stage.remove_action(this._touchGesture);
+            delete this._touchGesture;
+        }
+    }
 });